package com.tao.final_;

public class FinalDetail01 {
    public static void main(String[] args) {
        CC cc = new CC();//Final类虽然不能被继承，但是可以实例化对象

        new EE().show();//父类没有被Final修饰，但是父类方法被Final修饰，
                        // 虽然该方法不能被子类重写，但是可以被子类继承

        System.out.println(GG.n1);
    }
}
//final属性在定义时就必须赋值，并且之后不能在修改
//1.可以在定义属性时赋值
//2.可以在构造器中赋值
//3.可以在代码块中赋值
class AA{
    public final double TAX = 0.05;//定义属性时赋值
    public final double TAX2;
    public final double TAX3;

    public AA() {
        TAX2 = 0.09;
    }//构造器中赋值

    {
        TAX3 = 0.4;
    }//代码块中赋值
}

//如果Final修饰的属性是静态的，那么初始化的位置只能有：
//1.定义时赋值
//2.静态代码块中
class BB{
    public static final double TAX4 = 0.6;
    public static final double TAX5;

    public BB() {
        //TAX5 = 0.7;赋值失败
        //因为是在加载静态属性，并不是在加载实例属性，所以不能在构造器中赋值
        //静态属性在类加载的时候就要被初始化，而构造器在实例化对象时才会被调用
    }
    static{
        TAX5 = 0.8;
    }//静态代码块中赋值成功
}

final class CC{ }

class DD{
    public final void show() {
        System.out.println("show()");
    }
}
class EE extends DD{ }

final class FF{
    public final void hi(){}
    //其实这个类已经是Final类了，这个方法就没有必要被修饰成Final方法了
    //因为这个方法不能被继承，所以不能被重写
}

class GG{
    String s1 = "hello";//String是Final类，不能被继承
    public static final int n1 = 10;
    //当static和Final搭配使用时，调用这个属性，不会导致类被加载，所以下面静态代码块中的语句不会被执行
    static{
        System.out.println("静态代码块被调用...");
    }

}
